/*************************************************************************
	> File Name: sigaction_2.c
	> Author: Angel Criss
	> Blog: blog.abbycin.tk 
	> Created Time: Sat 21 Jun 2014 04:05:47 PM CST
 ************************************************************************/
// this example contains the use of flag: SA_SIGINFO
// man 2 sigaction

//#define _POSIX_C_SOURCE 199309
/*很奇怪,上面_POSIX_C_SOURCE 199309的定义可有可无,
这个程序在openSUSE Tumbleweed上运行会出现段错误
在ubuntu14.04上运行正常, SA_SIGINFO真是个奇怪的东西
*/

//不知道为什么 现在又能在openSUSE和Arch上正常运行了
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<errno.h>

static volatile int Once=0;

void dealing(int sig, siginfo_t *info, void *ucontext)
{
    if(sig==SIGQUIT||sig==SIGTERM)
    {
        Once=1;
        printf("process end\n");
        return;
    }
    printf("Cought signal: %d\n",sig);  //si_value只有在sigqueue发送信号时才真实
    printf("cought signal:\e[32m %d\e[0m  sig_value:\e[33m %d\e[0m  si_pid(signal sender's pid): \e[34m%d\e[0m  si_uid: \e[36m%d\e[0m\n",info->si_signo,info->si_value.sival_int,info->si_pid,info->si_uid);
}

int main(int argc, char *argv[])
{
    struct sigaction act;
    int sig;

    printf("%s's pid : %d\n",argv[0],getpid());

    act.sa_sigaction=dealing;
    act.sa_flags=SA_SIGINFO;
    sigfillset(&act.sa_mask);

    for(sig=1;sig<NSIG;sig++) //what is 'NSIG' 据说是 最大信号编号 最大64 "kill -l"
        if(sig!=SIGTSTP&&sig!=SIGQUIT)
            sigaction(sig,&act,NULL); //循环的作用是设置64个sigaction中断(除了SIGSTP && SIGQUIT,实际上只有62个,外加SIGSTOP && SIGKILL不能被阻塞,就只有60个

    while(!Once)
    pause();
}
